package com.sojson.util.mq.rabbit.code.interfaces;

import java.io.IOException;
import java.util.Map;

import com.rabbitmq.client.Channel;
import com.sojson.util.mq.rabbit.interfaces.IRabbitBaseExchangeUtil;

/**
 * Rabbit声明交换机工具类接口
 * 
 * @author liu
 * @date 2022-06-16
 */
public interface IRabbitCodeExchangeUtil extends IRabbitBaseExchangeUtil {

    /**
     * 声明一个交换机
     * 
     * @param channel
     * @param exchange  交换机名称
     * @return
     * @throws IOException
     */
    default com.rabbitmq.client.AMQP.Exchange.DeclareOk exchangeDeclare(Channel channel, String exchange)
        throws IOException {
        return exchangeDeclare(channel, exchange, true, false, false, getExchangeParam());
    }

    /**
     * 声明一个交换机
     * 
     * @param channel
     * @param exchange      交换机名称
     * @param durable       消息是否持久化(默认为false)
     * @param autoDelete    当交换机不再使用时,是否自动删除它(默认为false)
     * @param internal      设置是否内置的,如果设置为true,则表示是内置的交换器(默认为false)</BR>
     *                      客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式</BR>
     * @return
     * @throws IOException
     */
    default com.rabbitmq.client.AMQP.Exchange.DeclareOk exchangeDeclare(Channel channel, String exchange,
        boolean durable, boolean autoDelete, boolean internal) throws IOException {
        return exchangeDeclare(channel, exchange, durable, autoDelete, internal, getExchangeParam());
    }

    /**
     * 声明一个交换机
     * 
     * @param channel
     * @param exchange      交换机名称
     * @param durable       消息是否持久化(默认为false)
     * @param autoDelete    当交换机不再使用时,是否自动删除它(默认为false)
     * @param internal      设置是否内置的,如果设置为true,则表示是内置的交换器(默认为false)</BR>
     *                      客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式</BR>
     * @param arguments     交换机参数(默认为null)
     * @return
     * @throws IOException
     */
    default com.rabbitmq.client.AMQP.Exchange.DeclareOk exchangeDeclare(Channel channel, String exchange,
        boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments) throws IOException {
        return channel.exchangeDeclare(getExchangeName(exchange), getExchangeType(), durable, autoDelete,
            internal, arguments);
    }

}